﻿using System;
using System.Text;
using System.Drawing;

namespace HexPixel
{
	class HexTextParser
	{
		public static Color[] Parse(string strHexText, PixelSize ePixelSize)
		{
			if (strHexText.Length == 0)
				return null;

			// 앞뒤 공백, 줄넘기기 자르기
			strHexText = strHexText.Trim();
			strHexText = strHexText.TrimEnd('\n');

			// 2글자씩 1바이트 - 24는 3바이트, 32는 4바이트
			int nPixelSize = (PixelSize.BIT_24 == ePixelSize) ? 3 : 4;

			// 공백 제거
			StringBuilder strBuilder = new StringBuilder();
			foreach (char c in strHexText)
			{
				if (c == ' ' || c == '\n' || c == '	' || c == '\r')
					continue;

				if (c < '0' || 'f' < c)
					throw new Exception("InvalidValueException");

				strBuilder.Append(c);
			}

			// 텍스트 데이터를 바이트 데이터로 변환
			string strHexData = strBuilder.ToString();
			if (strHexData.Length % 2 != 0)
				throw new Exception("SizeError");

			byte[] byteData = new Byte[strHexData.Length / 2];

			string hex;
			for (int offset = 0; offset < byteData.Length - 1; ++offset)
			{
				hex = strHexData[offset * 2].ToString() + strHexData[offset * 2 + 1].ToString();
				byteData[offset] = Convert.ToByte(hex, 16);
			}

			// 바이트 데이터를 컬러 데이터로 변환
			Color[] colorData = new Color[byteData.Length / nPixelSize];
			for (int byteOffset = 0, colorOffset = 0; colorOffset < colorData.Length; colorOffset++)
			{
				byte a = (ePixelSize == PixelSize.BIT_24) ? Convert.ToByte(255) : byteData[byteOffset++];
				byte r = byteData[byteOffset++];
				byte g = byteData[byteOffset++];
				byte b = byteData[byteOffset++];

				colorData[colorOffset] = Color.FromArgb(a, r, g, b);
			}

			return colorData;
		}
	}
}
